IPv4
IP封包的組成部份,以及各部件的長度(事實上,真正的封包是由連續的位元依序排列在一起的,之所以分行,完全是因為排版的關係):
Version
版本 (VER)。表示的是IP規格版本,目前的 IP 規格多為版本4 (version 4),所以這裡的數值通常為0x4 (注意:封包使用的數字通常都是十六進位的)。
Internet Header Length
標頭長度 (IHL)。
從 IP 封包規格中看到前面的6行為header,如果Options和Padding沒有設定的話,也就只有5行的長度;每行有32bit;也就是4byte;那麼,5列就是20byte了。20這個數值換成16進位就成了0x14所以。當封包標頭長度為最短的時候,這裡數值會被換算為0x14。
Type of Service
服務類型 (TOS)。這裡指的是IP封包在傳送過程中要求的服務類型,其中一共由8個bit組成,每組bit組合分別代表不同的意思:
內容為『RRRDTRUU』:
RRR:Routine。設定IP順序,預設為0,否則,數值越高越優先
D:若為0表示一般延遲(delay),若為1表示為低延遲;
T:Throughput。若為0表示為一般傳輸量 (throughput),若為1表示為高傳輸量。
R:Reliability。若為 0 表示為一般可靠度(reliability),若為 1 表示高可靠度。
UU:Not Used。保留尚未被使用。
Total Length
封包總長(TL)。以byte做單位來表示該封包的總長度,此數值包括標頭和數據的總和。就是代表封包大小,IP標準的MTU就是65535bytes,就跟Total Length有關(2的16次方-1)
Identification
識別碼 (ID)。IP袋子必須要放在MAC袋子當中。不過,如果IP袋子太大的話,就得先要將IP再重組成較小的袋子然後再放到MAC當中。而當IP重組時,每個來自同一個IP的小袋子就得要有個識別碼以告知接收端這些小袋子其實是來自同一個IP封包才行。
Flag
旗標 (FL)。這是當封包在傳輸過程中進行最佳組合時使用的3個 bit的識別記號。
這個地方的內容為『0DM』,其意義為:
D:若為0表示可以分段,若為1表示不可分段
M:當上一個值為 0 時, 0表示此IP為最後分段,若為1表示非最後分段。
Fragment Offset
分割定位 (FO)。當一個大封包在經過一些傳輸單位(MTU)較小的路徑時,會被切割成碎片(fragment) 再進行傳送(這個切割和傳送層的打包有所不同,它是由網路層決定的)。由於網路情況或其它因素影響,其抵達順序並不會和當初切割順序一至的。所以當封包進行切割的時候,會為各片段做好定位記錄,所以在重組的時候,就能夠依號入座了。
所以就是IP分段要組合成原本的IP,需要:
Total Length(原本的IP的大小)
Identification(IP分段才能知道它是來自哪一個原本的IP)
Flags(知道哪個IP分段是最後一個分段,不然沒辦法確認IP分段到底到哪結束)
Fragment Offset(當要重組的時候,才能組成原本的IP,不然會把手腳顛倒)
Time To Live
存活時間 (TTL)。這個TTL的概念,在許多網路協定中都會碰到。當一個封包被賦予TTL值(以秒或跳站數目(hop)為單位),之後就會進行倒數計時。在IP協定中,TTL是以hop為單位,每經過一個router就減一﹐如果封包 TTL值被降為0的時候,就會被丟棄。這樣,當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面。有隻叫做traceroute的程式,就是一個TTL利用實作。
Protocol
協定(PROT)。這裡指的是該封包所使用的網路協定類型。例如﹕ICMP或TCP/UDP等等。要注意的是:這裡使用的協定是網路層的協定,這和上層的程式協定(如﹕FTP﹑HTTP 等)是不同的。可以從Linux的/etc/protocol這個檔案中找到這些協定和其代號。
Header Checksum
標頭檢驗值(HC)。這個數值主要用來檢錯用的,用以確保封包被正確無誤的接收到。當封包開始進行傳送後,接收端主機會利用這個檢驗值會來檢驗餘下的封包,如果一切看來無誤,就會發出確認信息,表示接收正常。
Source IP Address
來源位址(SA)。就是發送端的IP位址,長度為32bit。
Destination IP Address
目的地位址(DA)。也就是接收端的IP位址,長度為32 bit。
之後再來學IP的Class概念。